package ArrayList2;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User：Lenovo
 * Date:2025-01-04
 * Time:19:12
 */
//自己实现一个简单的顺序表
//以int为例，就不写泛型
public class MyArrayList {
    //真正存储数据，顺序表本身就说基于数组的封装
    private int[]arr;
    //约定arr数组中前size个元素，表示有效元素
    private int size=0;
    public MyArrayList(){
        //无参数版本默认容量为10
        arr=new int[10];
    }
    public MyArrayList(int capacity){
        arr=new int[capacity];
    }
    //获取元素个数
    public int size(){
        return size;
    }
    //新增元素,尾插
    public void add(int val){
        //把新的元素放到最后一个位置上，下标为size的位置
        if(size==arr.length){
            //数组满了，需要扩容[0,size)区间
            resize();
        }
        arr[size]=val;
        size++;
    }
    private void resize(){
        //1.创建一个更长的数组
        int[] newArr=new int[(int)(arr.length*1.5)];
        //2.原来数组的元素复制到新数组上
        for(int i=0;i<size;i++){
            newArr[i]=arr[i];
        }
        //3.用新数组替代旧数组
        arr=newArr;
    }
    //任意位置插入
    public void add(int index,int val){
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("Index out of bounds");
        }
        //如果数组满了，继续添加元素，也是需要扩容
        if(size==arr.length){
            resize();
        }
        //搬运元素的操作，从后往前，依次把每个元素往后搬运一个位置
        //如果元素的本身的下标是i，就把这个元素复制到i+1的位置上
        //index位置的元素也是需要往后搬运一下，i>=index
        for(int i=size-1;i>=index;i--){
            arr[i+1]=arr[i];
        }
        //此时就相当于把index的位置腾出来了，把新的元素放到index的位置就好了
        arr[index]=val;
        //更新size
        size++;
    }
    //根据下表获取元素
    public int get(int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("下标越界："+index);
        }
        return arr[index];
    }
    //根据下标设置元素
    public void set(int index,int val){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("下标越界："+index);
        }
        arr[index]=val;
    }
    //删除元素,按照下标删除
    public int remove(int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("下标越界："+index);
        }
        int result=arr[index];
//        if(index==size-1){
//            //尾删
//            size--;
//            return result;
//        }
        for(int i=index;i<size-1;i++){
            arr[i]=arr[i+1];
        }
        size--;
        return result;
    }
    //删除元素,按照值删除
    public void delete(int val){
        //先找元素的位置
        int index=0;
        for(;index<size;index++) {
            if (arr[index] == val) {
                //找到了
                break;
            }
        }
            if(index==size){
                return;
                //没有找到
            }
            for(int i=index;i<size-1;i++){
                arr[i]=arr[i+1];
            }
            size--;
        }

    //判断元素是否存在
    public boolean contains(int val){
        for(int i=0;i<size;i++){
            if(arr[i]==val){
                return true;
            }
        }
        return false;
    }
    //查找元素所在的位置
    public int indexof(int val){
        for(int i=0;i<size;i++){
            if(arr[i]==val){
                return i;
            }
        }
        return -1;
    }
    public int lastIndexof(int val){
        for(int i=size-1;i>=0;i--){
            if(arr[i]==val){
                return i;
            }
        }
        return -1;
    }
    //清空
    public void clear(){
        size=0;
    }
    //打印操作，搞一个toString,把MyArrayList转成字符串
    @Override
    public String toString(){
        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append("[");
        for(int i=0;i<size;i++){
            stringBuilder.append(arr[i]);
            if(i<size-1){
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
    //测试
    private static  void test1(){
        MyArrayList list=new MyArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        System.out.println(list.size());
        System.out.println(list);
    }
    private static void test2(){
        MyArrayList list=new MyArrayList(10);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(0,100);
        list.add(1,200);
        list.add(2,300);
        System.out.println(list);
    }
    private static void test3(){
        MyArrayList list=new MyArrayList(10);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.remove(0);
        System.out.println(list);
        list.remove(2);
        System.out.println(list);
        list.remove(4);
        System.out.println(list);
        list.remove(100);
        System.out.println(list);
    }
    private static void test4(){
        MyArrayList list=new MyArrayList(10);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.delete(3);
        System.out.println(list);
        list.delete(5);
        System.out.println(list);
        list.delete(100);
        System.out.println(list);
    }
    private static void test5() {
        MyArrayList list = new MyArrayList(10);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        System.out.println(list.contains(3));
        System.out.println(list.contains(100));
        System.out.println(list.indexof(5));
        System.out.println(list.indexof(100));
        if(list.lastIndexof(5)==4){
            System.out.println("ok");
        }else{
            System.out.println("failed");
        }
        if(list.lastIndexof(100)==-1){
            System.out.println("ok");
        }else{
            System.out.println("failed");
        }
    }

    public static void main(String[] args) {
        //test1();
//        test2();
//        test3();
//        test4();
        test5();
    }

}
